package cotacao

import util.GerenciadorTabelas;
import java.util.Vector;
import java.util.List;
import java.util.ArrayList;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.math.BigDecimal;
import ws.CotacaoPreco;
import ws.CotacaoPrecoMercadorias;
import ws.CotacaoPrecoVetor;
import ws.BuscaChaveEstrangeira;
import ws.BuscaChaveEstrangeiraVetor;
import wsgroovy.ManagerWebService;

class CotacaoMercadoriaController {
    
    def index = {
        redirect action:"list", params:params 
    }

    // the delete, save and update actions only accept POST requests
    static allowedMethods = [delete:'POST', save:'POST', update:'POST']

    def list = {
        GerenciadorTabelas.getInstance().getParams().clear();
        GerenciadorTabelas.getInstance().getCotacaoMercadorias().clear()

        def proxy = ManagerWebService.getInstance().getProxy()
        ArrayList<CotacaoPreco> lista = new ArrayList<CotacaoPreco>();

        println "Params> " + params

        //gambiarra para ver se ja foi atribuido 'def cotacaoPreco' com o tipo de classe lá do BPEL
        if( (params.buscaCotacoesFornecedor == null) && (ManagerWebService.getInstance().getCotacaoPreco().getClass() == String.class) ){
            def cot = proxy.readCotacaoPorId(-1)
            ManagerWebService.getInstance().setCotacaoPreco(cot);
        }

        //só faz a chamada do Web Service se foi digitado alguma coisa (aceita String vazia, barra de espaços e semelhantes)
        if(params.buscaCotacoesFornecedor != null){
            SimpleDateFormat s = new SimpleDateFormat();
            s.applyPattern("dd/MM/yyyy");
            String data = s.format(new Date(new Integer(params.buscaCotacoesData_year)-1900,
                    new Integer(params.buscaCotacoesData_month)-1,
                    new Integer(params.buscaCotacoesData_day)));
            def cotVetor = proxy.readCotacao(data, params.buscaCotacoesFornecedor)
            ManagerWebService.getInstance().setCotacaoPreco(cotVetor.getLista().get(0));
            lista = cotVetor.getLista();

            if(lista.get(0).getTcodigoPk() == -1){  //"desfaz a gambiarra com outra gambiarra hehehe"
                lista.clear();
            }
        }        

        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)

        [cotacaoMercadoriaInstanceList: lista]
    }

    def show = {
        //def cotacaoMercadoriaInstance = CotacaoMercadoria.get( params.id )
        //CotacaoPreco cotacao = GerenciadorTabelas.getInstance().getCotacaoPorId(Integer.parseInt(params.id));
        def cotacaoMercadoriaInstance = ManagerWebService.getInstance().getProxy().readCotacaoPorId(params.id)
        ArrayList<CotacaoPrecoMercadorias> lista = cotacaoMercadoriaInstance.getCotacaoPrecoMercadoriasList();        

        if(!cotacaoMercadoriaInstance) {
            flash.message = "CotacaoMercadoria not found with id ${params.id}"
            redirect(action:list)
        }
        else {            
            [ cotacaoMercadoriaInstance : cotacaoMercadoriaInstance, cotacaoMercadoriaInstanceList: lista ]
        }
    }

    def delete = {
        //def cotacaoMercadoriaInstance = CotacaoMercadoria.get( params.id )
        //boolean wasDeleted = GerenciadorTabelas.getInstance().deletarCotacao(Integer.parseInt(params.id));
        boolean wasDeleted = ManagerWebService.getInstance().getProxy().deleteCotacao(params.id);
        if(wasDeleted) {
            flash.message = "Cotacao ${params.id} deletada"
        }
        else {
            flash.message = "Cotacao não deletada ou não encontrada com id ${params.id}"
        }
        redirect(action:"list")
    }

    def edit = {
        def cotacaoMercadoriaInstance = ManagerWebService.getInstance().getProxy().readCotacaoPorId(params.id)
        ArrayList<CotacaoPrecoMercadorias> lista = cotacaoMercadoriaInstance.getCotacaoPrecoMercadoriasList();
        GerenciadorTabelas.getInstance().getCotacaoMercadorias().clear()
        //CotacaoMercadoria cm = new CotacaoMercadoria(cotacaoMercadoriaInstance)
        CotacaoPreco cp = new CotacaoPreco();
        cp.setTcodigo_pk(cotacaoMercadoriaInstance.tcodigoPk)
        cp.setTcondicao_compra_fk(cotacaoMercadoriaInstance.tcondicaoCompraFk)
        cp.setTdata(cotacaoMercadoriaInstance.tdata)
        cp.setTpedido_gerado(cotacaoMercadoriaInstance.tpedidoGerado)
        cp.setTunidade_fk(cotacaoMercadoriaInstance.tunidadeFk)
        GerenciadorTabelas.getInstance().setCotacao(cp)
        
        for(CotacaoPrecoMercadorias i : lista){
            CotacaoPrecoMercadorias m = new CotacaoPrecoMercadorias()
            m.setTcotacao_preco_fpk(i.getTcotacaoPrecoFpk())
            m.setTsequencia_pk(i.getTsequenciaPk())
            m.setTcodigo_mercadoria_fk(i.getTcodigoMercadoriaFk())
            m.setTcodigo_fornecedor_fk(i.getTcodigoFornecedorFk())
            m.setTpreco_cotacao(i.getTprecoCotacao())
            m.setTultimo_preco_cotado(i.getTultimoPrecoCotado())
            m.setTqtde_merc(i.getTqtdeMerc())
            m.setTdata_cotacao(i.getTdataCotacao())
            m.setTnome_mercadoria(i.getTnomeMercadoria())
            m.setTnome_fornecedor(i.getTnomeFornecedor())
            GerenciadorTabelas.getInstance().getCotacaoMercadorias().add(m)
        }
        //
        //        //ManagerWebService.getInstance().setCotacaoMercadorias(list2)
        //        def cotacaoToUpdateInstance = new CotacaoMercadoria()//lista.get(0)
        //        //GerenciadorTabelas.getInstance().setCotacaoMercadoriaToUpdate(cotacaoToUpdateInstance)
        //        //println "cotacaoToUpdate: " + cotacaoToUpdateInstance.tsequenciaPk
        //        //flash.message = "Atualizando a Cotação de número ${cotacaoToUpdateInstance.tsequenciaPk}"
        //
        //        if(!cotacaoMercadoriaInstance) {
        //            flash.message = "CotacaoMercadoria not found with id ${params.id}"
        //            redirect action:'list'
        //        }
        //        else {
        //            return [ cotacaoMercadoriaInstance : cotacaoMercadoriaInstance, cotacaoMercadoriaInstanceList: lista, cotacaoToUpdateInstance:cotacaoToUpdateInstance ]
        //        }

        cotacaoMercadoriaInstance = new CotacaoMercadoria()
        cotacaoMercadoriaInstance.tcondicao_compra_fk = cp.getTcondicao_compra_fk()
        cotacaoMercadoriaInstance.tpedido_gerado = cp.getTpedido_gerado()
        cotacaoMercadoriaInstance.tunidade_fk = cp.getTunidade_fk()
        cotacaoMercadoriaInstance.tcodigo_pk = cp.getTcodigo_pk()

        GerenciadorTabelas.getInstance().getParams().put("tunidade_fk", cotacaoMercadoriaInstance.tunidade_fk)
        GerenciadorTabelas.getInstance().getParams().put("tcondicao_compra_fk", cotacaoMercadoriaInstance.tcondicao_compra_fk)
        GerenciadorTabelas.getInstance().getParams().put("tpedido_gerado", cotacaoMercadoriaInstance.tpedido_gerado)
        GerenciadorTabelas.getInstance().getParams().put("tcodigo_pk", cotacaoMercadoriaInstance.tcodigo_pk)

        if(GerenciadorTabelas.getInstance().getParams().isEmpty()){
            cotacaoMercadoriaInstance.properties = params
        }
        else{
            cotacaoMercadoriaInstance.properties = GerenciadorTabelas.getInstance().getParams()
            GerenciadorTabelas.getInstance().resetMap();
            println "Valores depois: " + GerenciadorTabelas.getInstance().getParams()
        }
        //cotacaoMercadoriaInstance.properties = params
        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)
        [cotacaoMercadoriaInstance:cotacaoMercadoriaInstance, cotacaoMercadoriaInstanceList:lista]
    }

    def update = {
        println "UPDATE: " + params
        int id;
        if(GerenciadorTabelas.getInstance().getParams().isEmpty()){
            id = new Integer(params.id)
        }
        else{
            //id = new Integer(GerenciadorTabelas.getInstance().getParams().get("id"))
            id = GerenciadorTabelas.getInstance().getCotacao().getTcodigo_pk()
        }
        
        def cotacaoMercadoriaInstance = ManagerWebService.getInstance().getProxy().readCotacaoPorId(params.id)
        ArrayList<CotacaoPrecoMercadorias> lista = cotacaoMercadoriaInstance.getCotacaoPrecoMercadoriasList();
        
        if(cotacaoMercadoriaInstance) {
            if(params.version) {
                def version = params.version.toLong()
                if(cotacaoMercadoriaInstance.version > version) {
                    
                    cotacaoMercadoriaInstance.errors.rejectValue("version", "cotacaoMercadoria.optimistic.locking.failure", "Another user has updated this CotacaoMercadoria while you were editing.")

                    render view:'edit', model:[cotacaoMercadoriaInstance:cotacaoMercadoriaInstance, cotacaoMercadoriaInstanceList: lista]
                    return
                }
            }
            //cotacaoMercadoriaInstance.properties = params
            //if(!params.tpedido_gerado.equalsIgnoreCase(cotacao.getTpedido_gerado())){
            //cotacao.setTpedido_gerado(params.tpedido_gerado);
            //GerenciadorTabelas.getInstance().atualizarCotacao(cotacao);
            //            flash.message = "Operação UPDATE em manutenção..."
            //            redirect action:'list'
            //            }
            //            else {
            //                render view:'edit', model:[cotacaoMercadoriaInstance:cotacaoMercadoriaInstance, cotacaoMercadoriaInstanceList: lista]
            //                return
            //            }

            ArrayList<CotacaoPrecoMercadorias> listaAtualizada = GerenciadorTabelas.getInstance().getCotacaoMercadorias();
            cotacaoMercadoriaInstance = new CotacaoMercadoria()
            cotacaoMercadoriaInstance.properties = GerenciadorTabelas.getInstance().getParams()
            cotacaoMercadoriaInstance.properties = params

            if(!lista.isEmpty()){
                //flash.message = "Cotacao de Mercadorias efetuada!"

                //            CotacaoPreco cotacao = new CotacaoPreco();
                //            cotacao.setTcondicao_compra_fk(cotacaoMercadoriaInstance.tcondicao_compra_fk);
                //            cotacao.setTdata(new Date());
                //            cotacao.setTpedido_gerado(cotacaoMercadoriaInstance.tpedido_gerado);
                //            cotacao.setTunidade_fk(cotacaoMercadoriaInstance.tunidade_fk);
                //cotacao.setCotacaoPrecoMercadoriasList(new Vector(lista));
                def cotacao = ManagerWebService.getInstance().getCotacaoPreco()
                CotacaoPreco cotacaoAtual = GerenciadorTabelas.getInstance().getCotacao()
                cotacao.setTcodigoPk(cotacaoAtual.getTcodigo_pk())
                cotacao.setTcondicaoCompraFk(cotacaoMercadoriaInstance.tcondicao_compra_fk);
                cotacao.setTdata("");
                cotacao.setTunidadeFk(cotacaoMercadoriaInstance.tunidade_fk);
                if(params.gerarPedido == "on"){
                    println "Vai gerar pedido"
                    cotacao.setTpedidoGerado("S");
                }
                else{
                    println "Não vai gerar pedido"
                    cotacao.setTpedidoGerado("N");
                }

                for(CotacaoPrecoMercadorias i : listaAtualizada){
                    def p = ManagerWebService.getInstance().getCotacaoPrecoMercadoria()
                    p = p.getClass().newInstance();
                    p.setTcotacaoPrecoFpk(i.getTcotacao_preco_fpk())
                    p.setTsequenciaPk(i.getTsequencia_pk())
                    p.setTcodigoMercadoriaFk(i.getTcodigo_mercadoria_fk())
                    p.setTcodigoFornecedorFk(i.getTcodigo_fornecedor_fk())
                    p.setTprecoCotacao(i.getTpreco_cotacao())
                    p.setTultimoPrecoCotado(i.getTultimo_preco_cotado())
                    p.setTqtdeMerc(i.getTqtde_merc())
                    p.setTdataCotacao(i.getTdata_cotacao())
                    p.setTnomeMercadoria(i.getTnome_mercadoria())
                    p.setTnomeFornecedor(i.getTnome_fornecedor())

                    cotacao.getCotacaoPrecoMercadoriasList().add(p);
                }

                def proxy = ManagerWebService.getInstance().getProxy()

                println "Antes de enviar: " + cotacao.getCotacaoPrecoMercadoriasList()

                if(cotacao.getTpedidoGerado() == "S"){
                    if(proxy.updateCotacaoComPedido(cotacao) == true){
                        flash.message = "Cotação atualizada!"
                        GerenciadorTabelas.getInstance().getCotacaoMercadorias().clear();
                    }
                    else{
                        flash.message = "Cotação não atualizada!"
                    }
                }
                else{
                    if(proxy.updateCotacao(cotacao) == true){
                        flash.message = "Cotação atualizada!"
                        GerenciadorTabelas.getInstance().getCotacaoMercadorias().clear();
                    }
                    else{
                        flash.message = "Cotação não atualizada!"
                    }
                }
                //depois de finalizada a operação, o vetor das parcelas é ZERADO
                cotacao.getCotacaoPrecoMercadoriasList().clear()
                redirect action:'list'
            }
            else {
                //params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)
                flash.message = "Não foi possível atualizar a Cotação!!"
                //render view:'create', model:[cotacaoMercadoriaInstance:cotacaoMercadoriaInstance, cotacaoMercadoriaInstanceList: lista]
                redirect action:'list'
            }
        }
        else {
            flash.message = "Cotacao não encontrado com id ${params.id}"
            redirect action:'list'
        }
    }

    def create = {
        ArrayList<CotacaoPrecoMercadorias> lista = GerenciadorTabelas.getInstance().getCotacaoMercadorias();
        def cotacaoMercadoriaInstance = new CotacaoMercadoria()

        if(GerenciadorTabelas.getInstance().getParams().isEmpty()){
            cotacaoMercadoriaInstance.properties = params
        }
        else{
            //lista.clear();
            cotacaoMercadoriaInstance.properties = GerenciadorTabelas.getInstance().getParams()
            GerenciadorTabelas.getInstance().resetMap();            
            println "Valores depois: " + GerenciadorTabelas.getInstance().getParams()
        }
        //cotacaoMercadoriaInstance.properties = params
        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)
        [cotacaoMercadoriaInstance:cotacaoMercadoriaInstance, cotacaoMercadoriaInstanceList:lista]
    }

    def save = {
        ArrayList<CotacaoPrecoMercadorias> lista = GerenciadorTabelas.getInstance().getCotacaoMercadorias();
        def cotacaoMercadoriaInstance = new CotacaoMercadoria()
        cotacaoMercadoriaInstance.properties = GerenciadorTabelas.getInstance().getParams()
        cotacaoMercadoriaInstance.properties = params
        
        if(!lista.isEmpty()){
            flash.message = "Cotacao de Mercadorias efetuada!"

            //            CotacaoPreco cotacao = new CotacaoPreco();
            //            cotacao.setTcondicao_compra_fk(cotacaoMercadoriaInstance.tcondicao_compra_fk);
            //            cotacao.setTdata(new Date());
            //            cotacao.setTpedido_gerado(cotacaoMercadoriaInstance.tpedido_gerado);
            //            cotacao.setTunidade_fk(cotacaoMercadoriaInstance.tunidade_fk);
            //cotacao.setCotacaoPrecoMercadoriasList(new Vector(lista));
            def cotacao = ManagerWebService.getInstance().getCotacaoPreco()
            cotacao.setTcondicaoCompraFk(cotacaoMercadoriaInstance.tcondicao_compra_fk);
            cotacao.setTdata("");
            //cotacao.setTpedidoGerado(cotacaoMercadoriaInstance.tpedido_gerado);
            if(params.gerarPedido == true){
                cotacao.setTpedidoGerado("S");
            }
            else{
                cotacao.setTpedidoGerado("N");
            }
            
            cotacao.setTunidadeFk(cotacaoMercadoriaInstance.tunidade_fk);

            for(CotacaoPrecoMercadorias i : lista){
                def p = ManagerWebService.getInstance().getCotacaoPrecoMercadoria()
                p = p.getClass().newInstance();
                p.setTcotacaoPrecoFpk(i.getTcotacao_preco_fpk())
                p.setTsequenciaPk(i.getTsequencia_pk())
                p.setTcodigoMercadoriaFk(i.getTcodigo_mercadoria_fk())
                p.setTcodigoFornecedorFk(i.getTcodigo_fornecedor_fk())
                p.setTprecoCotacao(i.getTpreco_cotacao())
                p.setTultimoPrecoCotado(i.getTultimo_preco_cotado())
                p.setTqtdeMerc(i.getTqtde_merc())
                p.setTdataCotacao(i.getTdata_cotacao())
                p.setTnomeMercadoria(i.getTnome_mercadoria())
                p.setTnomeFornecedor(i.getTnome_fornecedor())

                cotacao.getCotacaoPrecoMercadoriasList().add(p);
            }

            def proxy = ManagerWebService.getInstance().getProxy()

            if(cotacao.getTpedidoGerado() == "S"){
                if(proxy.createCotacaoComPedido(cotacao) == true){
                    flash.message = "Cotação criada!"
                    GerenciadorTabelas.getInstance().getCotacaoMercadorias().clear();
                }
                else{
                    flash.message = "Cotação não criada!"
                }
            }
            else{
                if(proxy.createCotacaoSemPedido(cotacao) == true){
                    flash.message = "Cotação criada!"
                    GerenciadorTabelas.getInstance().getCotacaoMercadorias().clear();
                }
                else{
                    flash.message = "Cotação não criada!"
                }
            }            
            
            //depois de finalizada a operação, o vetor das parcelas é ZERADO
            cotacao.getCotacaoPrecoMercadoriasList().clear()
            redirect action:'list'
        }
        else {
            //params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)
            flash.message = "Cadastre ao menos 1 cotação!!"
            render view:'create', model:[cotacaoMercadoriaInstance:cotacaoMercadoriaInstance, cotacaoMercadoriaInstanceList: lista]
        }        
    }

    def insereCotacao = {
        ArrayList<CotacaoPrecoMercadorias> lista = GerenciadorTabelas.getInstance().getCotacaoMercadorias();
        def cotacaoMercadoriaInstance = new CotacaoMercadoria()
        cotacaoMercadoriaInstance.properties = GerenciadorTabelas.getInstance().getParams()
        cotacaoMercadoriaInstance.properties = params

        cotacaoMercadoriaInstance.tcodigo_pk = 1
        cotacaoMercadoriaInstance.tsequencia_pk = 0
        cotacaoMercadoriaInstance.tpedido_gerado = "N"
        println "Insere cotacao: " + params
        println "Insere cotacao2: " + GerenciadorTabelas.getInstance().getParams()
        if(cotacaoMercadoriaInstance.validate()){

            //Converte tpreco_cotacao para BigDecimal
            String pc = cotacaoMercadoriaInstance.tpreco_cotacao;
            pc = pc.replace(".", "");
            pc = pc.replace(",", ".");
            BigDecimal precoCotacao = new BigDecimal(pc);

            //Converte tultimo_preco_cotado para BigDecimal
            String upc = cotacaoMercadoriaInstance.tultimo_preco_cotado;
            upc = upc.replace(".", "");
            upc = upc.replace(",", ".");
            BigDecimal ultimoPrecoCotado = new BigDecimal(upc);

            //Converte tqtde_merc para Integer
            Integer qtdeMerc = new Integer(cotacaoMercadoriaInstance.tqtde_merc);
            
            CotacaoPrecoMercadorias cotMerc = new CotacaoPrecoMercadorias();
            cotMerc.setTcodigo_fornecedor_fk(cotacaoMercadoriaInstance.tcodigo_fornecedor_fk);
            cotMerc.setTcodigo_mercadoria_fk(cotacaoMercadoriaInstance.tcodigo_mercadoria_fk);
            cotMerc.setTnome_fornecedor(cotacaoMercadoriaInstance.tnome_fornecedor);
            cotMerc.setTnome_mercadoria(cotacaoMercadoriaInstance.tnome_mercadoria);
            cotMerc.setTpreco_cotacao(precoCotacao);
            cotMerc.setTqtde_merc(qtdeMerc);
            cotMerc.setTultimo_preco_cotado(ultimoPrecoCotado);

            lista.add(cotMerc);
            params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)            
            
            flash.message = "Mercadoria inserida na Cotacao!"
        }
        render view:'create', model:[cotacaoMercadoriaInstance:cotacaoMercadoriaInstance, cotacaoMercadoriaInstanceList: lista]
    }

    def alterarCotacao = {
        def cotacaoMercadoriaInstance = new CotacaoMercadoria()
        def cotacao = GerenciadorTabelas.getInstance().getCotacao()
        //        cotacaoMercadoriaInstance.tunidade_fk = cotacao.getTunidade_fk()
        //        cotacaoMercadoriaInstance.tcondicao_compra_fk = cotacao.getTcondicao_compra_fk()
        //        cotacaoMercadoriaInstance.tcodigo_pk = cotacao.getTcodigo_pk()
        //        cotacaoMercadoriaInstance.tpedido_gerado = cotacao.getTpedido_gerado()

        cotacaoMercadoriaInstance.tunidade_fk = GerenciadorTabelas.getInstance().getParams().get("tunidade_fk")
        cotacaoMercadoriaInstance.tcondicao_compra_fk = new Integer(GerenciadorTabelas.getInstance().getParams().get("tcondicao_compra_fk"))
        cotacaoMercadoriaInstance.tcodigo_pk = GerenciadorTabelas.getInstance().getParams().get("tcodigo_pk")
        cotacaoMercadoriaInstance.tpedido_gerado = GerenciadorTabelas.getInstance().getParams().get("tpedido_gerado")

        ArrayList<CotacaoPrecoMercadorias> lista = GerenciadorTabelas.getInstance().getCotacaoMercadorias()
        def cotacaoToUpdateInstance = GerenciadorTabelas.getInstance().getCotacaoMercadorias().get(Integer.parseInt(params.id));
        
        //GerenciadorTabelas.getInstance().setCotacaoMercadoriaToUpdate(cotacaoToUpdateInstance)
        cotacaoMercadoriaInstance.tcodigo_mercadoria_fk = cotacaoToUpdateInstance.getTcodigo_mercadoria_fk()
        cotacaoMercadoriaInstance.tnome_mercadoria = cotacaoToUpdateInstance.getTnome_mercadoria()
        cotacaoMercadoriaInstance.tqtde_merc = cotacaoToUpdateInstance.getTqtde_merc()
        cotacaoMercadoriaInstance.tcodigo_fornecedor_fk = cotacaoToUpdateInstance.getTcodigo_fornecedor_fk()
        cotacaoMercadoriaInstance.tnome_fornecedor = cotacaoToUpdateInstance.getTnome_fornecedor()
        cotacaoMercadoriaInstance.tpreco_cotacao = cotacaoToUpdateInstance.getTpreco_cotacao()
        cotacaoMercadoriaInstance.tultimo_preco_cotado = cotacaoToUpdateInstance.getTultimo_preco_cotado()
        cotacaoMercadoriaInstance.tsequencia_pk = cotacaoToUpdateInstance.getTsequencia_pk()
        println "cotacaoToUpdate: " + cotacaoToUpdateInstance.tsequencia_pk

        GerenciadorTabelas.getInstance().getParams().put("tunidade_fk", cotacaoMercadoriaInstance.tunidade_fk)
        GerenciadorTabelas.getInstance().getParams().put("tcondicao_compra_fk", cotacaoMercadoriaInstance.tcondicao_compra_fk)
        GerenciadorTabelas.getInstance().getParams().put("tcodigo_mercadoria_fk", cotacaoMercadoriaInstance.tcodigo_mercadoria_fk)
        GerenciadorTabelas.getInstance().getParams().put("tnome_mercadoria", cotacaoMercadoriaInstance.tnome_mercadoria)
        GerenciadorTabelas.getInstance().getParams().put("tqtde_merc", cotacaoMercadoriaInstance.tqtde_merc)
        GerenciadorTabelas.getInstance().getParams().put("tcodigo_fornecedor_fk", cotacaoMercadoriaInstance.tcodigo_fornecedor_fk)
        GerenciadorTabelas.getInstance().getParams().put("tnome_fornecedor", cotacaoMercadoriaInstance.tnome_fornecedor)
        GerenciadorTabelas.getInstance().getParams().put("tpreco_cotacao", cotacaoMercadoriaInstance.tpreco_cotacao)
        GerenciadorTabelas.getInstance().getParams().put("tultimo_preco_cotado", cotacaoMercadoriaInstance.tultimo_preco_cotado)
        GerenciadorTabelas.getInstance().getParams().put("tsequencia_pk", cotacaoMercadoriaInstance.tsequencia_pk)
        GerenciadorTabelas.getInstance().getParams().put("tcodigo_pk", cotacaoMercadoriaInstance.tcodigo_pk)
        GerenciadorTabelas.getInstance().getParams().put("tpedido_gerado", cotacaoMercadoriaInstance.tpedido_gerado)

        flash.message = "Atualizando a Cotação de número ${cotacaoMercadoriaInstance.tsequencia_pk}"
        render view:'edit', model:[ cotacaoMercadoriaInstance : cotacaoMercadoriaInstance, cotacaoMercadoriaInstanceList: lista]//, cotacaoToUpdateInstance:cotacaoToUpdateInstance ]
        
    }

    def atualizarCotacao = {
        //def cotacaoMercadoriaInstance = GerenciadorTabelas.getInstance().getCotacao()
        ArrayList<CotacaoPrecoMercadorias> lista = GerenciadorTabelas.getInstance().getCotacaoMercadorias()
        if(params.id == ""){
            params.id = "1"
        }

        def cotacaoToUpdateInstance = GerenciadorTabelas.getInstance().getCotacaoMercadorias().get(Integer.parseInt(params.id) - 1);
        GerenciadorTabelas.getInstance().setCotacaoMercadoriaToUpdate(cotacaoToUpdateInstance)
        println "cotacaoToUpdate: " + cotacaoToUpdateInstance.tsequencia_pk

        //atualizando a cotacao filha
        def cotacaoMercadoriaInstance = new CotacaoMercadoria()
        cotacaoMercadoriaInstance.tsequencia_pk = 1
        cotacaoMercadoriaInstance.properties = GerenciadorTabelas.getInstance().getParams()     //o que for selecionado de FK não estará vazio
        cotacaoMercadoriaInstance.properties = params       //se estiver vazio, realmente veio como 'blank'

        //cotacaoMercadoriaInstance.tcodigo_pk = 1
        //cotacaoMercadoriaInstance.tpedido_gerado = "N"
        println "seq: " + cotacaoMercadoriaInstance.tsequencia_pk
        println "Atualiza cotacao: " + params
        println "Atualiza cotacao2: " + GerenciadorTabelas.getInstance().getParams()
        if(cotacaoMercadoriaInstance.validate()){

            println "validou"
            //Converte tpreco_cotacao para BigDecimal
            String pc = cotacaoMercadoriaInstance.tpreco_cotacao;
            pc = pc.replace(".", "");
            pc = pc.replace(",", ".");
            BigDecimal precoCotacao = new BigDecimal(pc);

            //Converte tultimo_preco_cotado para BigDecimal
            String upc = cotacaoMercadoriaInstance.tultimo_preco_cotado;
            upc = upc.replace(".", "");
            upc = upc.replace(",", ".");
            BigDecimal ultimoPrecoCotado = new BigDecimal(upc);

            //Converte tqtde_merc para Integer
            Integer qtdeMerc = new Integer(cotacaoMercadoriaInstance.tqtde_merc);

            CotacaoPrecoMercadorias cotMerc = new CotacaoPrecoMercadorias();
            cotMerc.setTcodigo_fornecedor_fk(cotacaoMercadoriaInstance.tcodigo_fornecedor_fk);
            cotMerc.setTcodigo_mercadoria_fk(cotacaoMercadoriaInstance.tcodigo_mercadoria_fk);
            cotMerc.setTnome_fornecedor(cotacaoMercadoriaInstance.tnome_fornecedor);
            cotMerc.setTnome_mercadoria(cotacaoMercadoriaInstance.tnome_mercadoria);
            cotMerc.setTpreco_cotacao(precoCotacao);
            cotMerc.setTqtde_merc(qtdeMerc);
            cotMerc.setTultimo_preco_cotado(ultimoPrecoCotado);
            cotMerc.setTsequencia_pk(cotacaoMercadoriaInstance.tsequencia_pk);

            //lista.add(cotMerc);
            lista.set(cotacaoToUpdateInstance.tsequencia_pk-1, cotMerc);
            params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)

            flash.message = "Cotação de número ${cotacaoToUpdateInstance.tsequenciaPk} atualizada"
            cotacaoMercadoriaInstance = new CotacaoMercadoria()
            cotacaoMercadoriaInstance.tunidade_fk = GerenciadorTabelas.getInstance().getParams().get("tunidade_fk")
            cotacaoMercadoriaInstance.tcondicao_compra_fk = new Integer(GerenciadorTabelas.getInstance().getParams().get("tcondicao_compra_fk"))
            cotacaoMercadoriaInstance.tcodigo_pk = GerenciadorTabelas.getInstance().getParams().get("tcodigo_pk")
            cotacaoMercadoriaInstance.tpedido_gerado = GerenciadorTabelas.getInstance().getParams().get("tpedido_gerado")
        }
        //terminando de atualizar a cotacao filha

        render view:'edit', model:[ cotacaoMercadoriaInstance : cotacaoMercadoriaInstance, cotacaoMercadoriaInstanceList: lista]//, cotacaoToUpdateInstance:cotacaoToUpdateInstance ]
    }

    def deletarCotacao = {
        ArrayList<CotacaoPrecoMercadorias> lista = GerenciadorTabelas.getInstance().getCotacaoMercadorias()
        if(lista.size() == 1){
            flash.message = "Ao menos 1 cotação deve permanecer cadastrada. Modifique-a em vez de deletá-la!"
        }
        else{
            GerenciadorTabelas.getInstance().removerCotacao(Integer.parseInt(params.id))
        }

        def cotacaoMercadoriaInstance = new CotacaoMercadoria()
        def cotacao = GerenciadorTabelas.getInstance().getCotacao()
        cotacaoMercadoriaInstance.tunidade_fk = cotacao.getTunidade_fk()
        cotacaoMercadoriaInstance.tcondicao_compra_fk = cotacao.getTcondicao_compra_fk()
        cotacaoMercadoriaInstance.tcodigo_pk = cotacao.getTcodigo_pk()
        cotacaoMercadoriaInstance.tpedido_gerado = cotacao.getTpedido_gerado()

        //flash.message = "Cotação de número ${params.id + 1} deletada!"
        render view:'edit', model:[ cotacaoMercadoriaInstance : cotacaoMercadoriaInstance, cotacaoMercadoriaInstanceList: lista]//, cotacaoToUpdateInstance:cotacaoToUpdateInstance ]
    }

    def insereCotacaoNoEdit = {
        ArrayList<CotacaoPrecoMercadorias> lista = GerenciadorTabelas.getInstance().getCotacaoMercadorias();
        def cotacaoMercadoriaInstance = new CotacaoMercadoria()
        cotacaoMercadoriaInstance.properties = GerenciadorTabelas.getInstance().getParams()
        cotacaoMercadoriaInstance.properties = params

        cotacaoMercadoriaInstance.tcodigo_pk = 1
        cotacaoMercadoriaInstance.tsequencia_pk = 0
        cotacaoMercadoriaInstance.tpedido_gerado = "N"
        println "Insere cotacao: " + params
        println "Insere cotacao2: " + GerenciadorTabelas.getInstance().getParams()
        if(cotacaoMercadoriaInstance.validate()){

            //Converte tpreco_cotacao para BigDecimal
            String pc = cotacaoMercadoriaInstance.tpreco_cotacao;
            pc = pc.replace(".", "");
            pc = pc.replace(",", ".");
            BigDecimal precoCotacao = new BigDecimal(pc);

            //Converte tultimo_preco_cotado para BigDecimal
            String upc = cotacaoMercadoriaInstance.tultimo_preco_cotado;
            upc = upc.replace(".", "");
            upc = upc.replace(",", ".");
            BigDecimal ultimoPrecoCotado = new BigDecimal(upc);

            //Converte tqtde_merc para Integer
            Integer qtdeMerc = new Integer(cotacaoMercadoriaInstance.tqtde_merc);

            CotacaoPrecoMercadorias cotMerc = new CotacaoPrecoMercadorias();
            cotMerc.setTcodigo_fornecedor_fk(cotacaoMercadoriaInstance.tcodigo_fornecedor_fk);
            cotMerc.setTcodigo_mercadoria_fk(cotacaoMercadoriaInstance.tcodigo_mercadoria_fk);
            cotMerc.setTnome_fornecedor(cotacaoMercadoriaInstance.tnome_fornecedor);
            cotMerc.setTnome_mercadoria(cotacaoMercadoriaInstance.tnome_mercadoria);
            cotMerc.setTpreco_cotacao(precoCotacao);
            cotMerc.setTqtde_merc(qtdeMerc);
            cotMerc.setTultimo_preco_cotado(ultimoPrecoCotado);

            cotMerc.setTsequencia_pk(lista.size()+1)
            lista.add(cotMerc);
            params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)

            cotacaoMercadoriaInstance = new CotacaoMercadoria()
            cotacaoMercadoriaInstance.tunidade_fk = GerenciadorTabelas.getInstance().getParams().get("tunidade_fk")
            cotacaoMercadoriaInstance.tcondicao_compra_fk = new Integer(GerenciadorTabelas.getInstance().getParams().get("tcondicao_compra_fk"))
            cotacaoMercadoriaInstance.tcodigo_pk = GerenciadorTabelas.getInstance().getParams().get("tcodigo_pk")
            cotacaoMercadoriaInstance.tpedido_gerado = GerenciadorTabelas.getInstance().getParams().get("tpedido_gerado")

            flash.message = "Mercadoria inserida na Cotacao!"
        }
        render view:'edit', model:[ cotacaoMercadoriaInstance : cotacaoMercadoriaInstance, cotacaoMercadoriaInstanceList: lista]//, cotacaoToUpdateInstance:cotacaoToUpdateInstance ]
    }

    def searchUnidade = {
        //redirect action:"list", params:params
        println "searchUnidade: " + params
        render view:'searchUnidade', params:params
        GerenciadorTabelas.getInstance().setParams(new HashMap(params));
    }

    def selecionarUnidade = {
        GerenciadorTabelas.getInstance().getParams().put("tunidade_fk", params.id)
        ArrayList<CotacaoPrecoMercadorias> lista = GerenciadorTabelas.getInstance().getCotacaoMercadorias();

        if(GerenciadorTabelas.getInstance().getParams().containsKey("id")){
            //def cotacaoMercadoriaInstance = GerenciadorTabelas.getInstance().getCotacao()

            //atualizando a cotacao filha
            def cotacaoMercadoriaInstance = new CotacaoMercadoria()
            cotacaoMercadoriaInstance.properties = GerenciadorTabelas.getInstance().getParams()     //o que for selecionado de FK não estará vazio
            cotacaoMercadoriaInstance.properties = params       //se estiver vazio, realmente veio como 'blank'

            println "Se contains ID: " + GerenciadorTabelas.getInstance().getParams()
            cotacaoMercadoriaInstance.setTunidade_fk(new Integer(GerenciadorTabelas.getInstance().getParams().get("tunidade_fk")))
            //println cotacaoMercadoriaInstance.getTcondicaoCompraFk()
            
            //def cotacaoToUpdateInstance = GerenciadorTabelas.getInstance().getCotacaoMercadorias().get(0);
            //println cotacaoToUpdateInstance.getClass()
            render view:'edit', model:[cotacaoMercadoriaInstance:cotacaoMercadoriaInstance, cotacaoMercadoriaInstanceList: lista]//, cotacaoToUpdateInstance:cotacaoToUpdateInstance]
        }
        else{
            redirect action:'create'
        }
    }

    def buscarUnidadePorId = {

        def proxy = ManagerWebService.getInstance().getProxy()
        def unidadeFK = proxy.searchUnidadePorId(params.codigoUnidade);

        ArrayList<BuscaChaveEstrangeira> lista = new ArrayList<BuscaChaveEstrangeira>();

        if(unidadeFK != null){
            lista = unidadeFK.getLista();
        }
        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)

        //render view:'create', model:[classificacaoFiscalList: lista, 'fornecedorDominioInstance':fornecedorDominioInstance]
        render view:'searchUnidade', model:[unidadeList: lista]
    }

    def buscarUnidadePorNome = {
        def proxy = ManagerWebService.getInstance().getProxy()
        def unidadeFK = proxy.searchUnidadePorNome(params.nomeUnidade);

        ArrayList<BuscaChaveEstrangeira> lista = new ArrayList<BuscaChaveEstrangeira>();

        if(unidadeFK != null){
            lista = unidadeFK.getLista();
        }
        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)

        //render view:'create', model:[classificacaoFiscalList: lista]
        render view:'searchUnidade', model:[unidadeList: lista]
    }

    def searchCondicao = {
        //redirect action:"list", params:params
        render view:'searchCondicao', params:params
        GerenciadorTabelas.getInstance().setParams(new HashMap(params));
    }

    def selecionarCondicao = {
        GerenciadorTabelas.getInstance().getParams().put("tcondicao_compra_fk", params.id)
        ArrayList<CotacaoPrecoMercadorias> lista = GerenciadorTabelas.getInstance().getCotacaoMercadorias();

        if(GerenciadorTabelas.getInstance().getParams().containsKey("id")){
            //def cotacaoMercadoriaInstance = GerenciadorTabelas.getInstance().getCotacao()

            //atualizando a cotacao filha
            def cotacaoMercadoriaInstance = new CotacaoMercadoria()
            cotacaoMercadoriaInstance.properties = GerenciadorTabelas.getInstance().getParams()     //o que for selecionado de FK não estará vazio
            cotacaoMercadoriaInstance.properties = params       //se estiver vazio, realmente veio como 'blank'
            
            println "Se contains ID: " + GerenciadorTabelas.getInstance().getParams()
            cotacaoMercadoriaInstance.setTcondicao_compra_fk(new Integer(GerenciadorTabelas.getInstance().getParams().get("tcondicao_compra_fk")))
            //def cotacaoToUpdateInstance = GerenciadorTabelas.getInstance().getCotacaoMercadorias().get(0);
            
            render view:'edit', model:[cotacaoMercadoriaInstance:cotacaoMercadoriaInstance, cotacaoMercadoriaInstanceList: lista]//, cotacaoToUpdateInstance:cotacaoToUpdateInstance]
        }
        else{
            redirect action:'create'
        }
    }

    def buscarCondicaoPorId = {
        def proxy = ManagerWebService.getInstance().getProxy()
        def condicaoFK = proxy.searchCondicaoPorId(params.codigoCondicao);

        ArrayList<BuscaChaveEstrangeira> lista = new ArrayList<BuscaChaveEstrangeira>();

        if(condicaoFK != null){
            lista = condicaoFK.getLista();
        }
        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)

        //[cidadeCEPList: lista, cidadeCEPListTotal: lista.size()]
        render view:'searchCondicao', model:[condicaoList: lista]
    }

    def buscarCondicaoPorDescricao = {
        def proxy = ManagerWebService.getInstance().getProxy()
        def condicaoFK = proxy.searchCondicaoPorNome(params.descricaoCondicao);

        ArrayList<BuscaChaveEstrangeira> lista = new ArrayList<BuscaChaveEstrangeira>();

        if(condicaoFK != null){
            println "condicao: " + condicaoFK.getLista()
            lista = condicaoFK.getLista();
        }
        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)

        //[cidadeCEPList: lista, cidadeCEPListTotal: lista.size()]
        render view:'searchCondicao', model:[condicaoList: lista]
    }

    def searchMercadoria = {
        //redirect action:"list", params:params
        render view:'searchMercadoria', params:params
        GerenciadorTabelas.getInstance().setParams(new HashMap(params));
    }

    def selecionarMercadoria = {
        GerenciadorTabelas.getInstance().getParams().put("tcodigo_mercadoria_fk", params.id)
        GerenciadorTabelas.getInstance().getParams().put("tnome_mercadoria", params.nome.decodeHTML())
        GerenciadorTabelas.getInstance().getParams().put("tultimo_preco_cotado", "888.888,88")
        ArrayList<CotacaoPrecoMercadorias> lista = GerenciadorTabelas.getInstance().getCotacaoMercadorias();

        if(GerenciadorTabelas.getInstance().getParams().containsKey("id")){
            //            def cotacaoToUpdateInstance2 = GerenciadorTabelas.getInstance().getCotacaoMercadoriaToUpdate()
            //            println "update instance: " + cotacaoToUpdateInstance2
            //            def cotacaoToUpdateInstance = cotacaoToUpdateInstance2.getClass().newInstance()

            //atualizando a cotacao filha
            def cotacaoMercadoriaInstance = new CotacaoMercadoria()
            cotacaoMercadoriaInstance.properties = GerenciadorTabelas.getInstance().getParams()     //o que for selecionado de FK não estará vazio
            cotacaoMercadoriaInstance.properties = params       //se estiver vazio, realmente veio como 'blank'

            //            cotacaoToUpdateInstance.setTcotacao_preco_fpk(cotacaoToUpdateInstance2.getTcotacao_preco_fpk())
            //            cotacaoToUpdateInstance.setTcodigo_fornecedor_fk(cotacaoToUpdateInstance2.getTcodigo_fornecedor_fk())
            //            cotacaoToUpdateInstance.setTpreco_cotacao(cotacaoToUpdateInstance2.getTpreco_cotacao())
            //            cotacaoToUpdateInstance.setTultimo_preco_cotado(cotacaoToUpdateInstance2.getTultimo_preco_cotado())
            //            cotacaoToUpdateInstance.setTqtde_merc(cotacaoToUpdateInstance2.getTqtde_merc())
            //            cotacaoToUpdateInstance.setTnome_fornecedor(cotacaoToUpdateInstance2.getTnome_fornecedor())

            println "Se contains ID: " + GerenciadorTabelas.getInstance().getParams()

            cotacaoMercadoriaInstance.setTcodigo_mercadoria_fk(new Integer(GerenciadorTabelas.getInstance().getParams().get("tcodigo_mercadoria_fk")))
            cotacaoMercadoriaInstance.setTnome_mercadoria(GerenciadorTabelas.getInstance().getParams().get("tnome_mercadoria"))

            //Converte tultimo_preco_cotado para BigDecimal
            //            String upc = GerenciadorTabelas.getInstance().getParams().get("tultimo_preco_cotado");
            //            upc = upc.replace(".", "");
            //            upc = upc.replace(",", ".");
            //            BigDecimal ultimoPrecoCotado = new BigDecimal(upc);
            cotacaoMercadoriaInstance.setTultimo_preco_cotado(GerenciadorTabelas.getInstance().getParams().get("tultimo_preco_cotado"))

            //def cotacaoMercadoriaInstance = GerenciadorTabelas.getInstance().getCotacao()//GerenciadorTabelas.getInstance().getCotacaoMercadorias().get(0);
            //flash.message = "Atualizando a Cotação de número ${cotacaoToUpdateInstance2.tsequenciaPk}"
            render view:'edit', model:[cotacaoMercadoriaInstance:cotacaoMercadoriaInstance, cotacaoMercadoriaInstanceList: lista]//, cotacaoToUpdateInstance:cotacaoToUpdateInstance]
        }
        else{
            redirect action:'create'
        }
    }

    def buscarMercadoriaPorId = {

        println "Codigo: " + GerenciadorTabelas.getInstance().getParams();
        def proxy = ManagerWebService.getInstance().getProxy()
        def mercadoriaFK = proxy.searchMercadoriaPorId(params.codigoMercadoria);

        ArrayList<BuscaChaveEstrangeira> lista = new ArrayList<BuscaChaveEstrangeira>();

        if(mercadoriaFK != null){
            lista = mercadoriaFK.getLista();
        }
        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)

        //render view:'create', model:[classificacaoFiscalList: lista, 'fornecedorDominioInstance':fornecedorDominioInstance]
        render view:'searchMercadoria', model:[mercadoriaList: lista]
    }

    def buscarMercadoriaPorNome = {
        def proxy = ManagerWebService.getInstance().getProxy()
        def mercadoriaFK = proxy.searchMercadoriaPorNome(params.nomeMercadoria);

        ArrayList<BuscaChaveEstrangeira> lista = new ArrayList<BuscaChaveEstrangeira>();

        if(mercadoriaFK != null){
            lista = mercadoriaFK.getLista();
        }
        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)

        //render view:'create', model:[classificacaoFiscalList: lista]
        render view:'searchMercadoria', model:[mercadoriaList: lista]
    }

    def searchFornecedor = {
        //redirect action:"list", params:params
        render view:'searchFornecedor', params:params
        GerenciadorTabelas.getInstance().setParams(new HashMap(params));
    }

    def selecionarFornecedor = {
        GerenciadorTabelas.getInstance().getParams().put("tcodigo_fornecedor_fk", params.id)
        GerenciadorTabelas.getInstance().getParams().put("tnome_fornecedor", params.nome)
        ArrayList<CotacaoPrecoMercadorias> lista = GerenciadorTabelas.getInstance().getCotacaoMercadorias();

        if(GerenciadorTabelas.getInstance().getParams().containsKey("id")){
            def cotacaoMercadoriaInstance = new CotacaoMercadoria()
            cotacaoMercadoriaInstance.properties = GerenciadorTabelas.getInstance().getParams()     //o que for selecionado de FK não estará vazio
            cotacaoMercadoriaInstance.properties = params       //se estiver vazio, realmente veio como 'blank'
            
            println "Se contains ID: " + GerenciadorTabelas.getInstance().getParams()
            cotacaoMercadoriaInstance.setTcodigo_fornecedor_fk(new Integer(GerenciadorTabelas.getInstance().getParams().get("tcodigo_fornecedor_fk")))
            cotacaoMercadoriaInstance.setTnome_fornecedor(GerenciadorTabelas.getInstance().getParams().get("tnome_fornecedor"))
            //def cotacaoToUpdateInstance = GerenciadorTabelas.getInstance().getCotacaoMercadorias().get(0);
            render view:'edit', model:[cotacaoMercadoriaInstance:cotacaoMercadoriaInstance, cotacaoMercadoriaInstanceList: lista]//, cotacaoToUpdateInstance:cotacaoToUpdateInstance]
        }
        else{
            redirect action:'create'
        }
    }

    def buscarFornecedorPorId = {
        def proxy = ManagerWebService.getInstance().getProxy()
        def fornecedorFK = proxy.searchFornecedorPorId(params.codigoFornecedor);

        ArrayList<BuscaChaveEstrangeira> lista = new ArrayList<BuscaChaveEstrangeira>();

        if(fornecedorFK != null){
            lista = fornecedorFK.getLista();
        }
        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)

        //[cidadeCEPList: lista, cidadeCEPListTotal: lista.size()]
        render view:'searchFornecedor', model:[fornecedorList: lista]
    }

    def buscarFornecedorPorNome = {
        def proxy = ManagerWebService.getInstance().getProxy()
        def fornecedorFK = proxy.searchFornecedorPorNome(params.nomeFornecedor);

        ArrayList<BuscaChaveEstrangeira> lista = new ArrayList<BuscaChaveEstrangeira>();

        if(fornecedorFK != null){
            lista = fornecedorFK.getLista();
        }
        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)

        //[cidadeCEPList: lista, cidadeCEPListTotal: lista.size()]
        render view:'searchFornecedor', model:[fornecedorList: lista]
    }
}